package com.czk.aspect;

import com.czk.connection.MyConnection;
import com.czk.transational.CzkTransaction;
import com.czk.transational.CzkTransactionManager;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.sql.Connection;

/**
 * 切面
 * 在获取数据源上返回自己的数据源对象
 *
 * @Author:ChenZhangKun
 * @Date: 2021/4/4 21:45
 */
@Aspect
@Component
@Order(2)
public class DatasourceAspect {
    /**
     * 切的是一个接口，所以所有的实现类都会被切到
     * spring肯定会调用这个方法来生成一个本地事务
     * 所以point.proceed()返回的也是一个Connection
     * 默认是tomcat连接池
     *
     * @param joinPoint
     * @return
     */
    @Around("execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(..))")
    public Connection around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 执行环绕方法
        // 拿到当前的事务
        CzkTransaction current = CzkTransactionManager.getCurrent();
        if (current != null) {
            // 当前事务不等于null
            // 封装connection
            // 一个连接绑定一个事务
            MyConnection myConnection = new MyConnection((Connection) joinPoint.proceed(), current);
            System.out.println("替换数据源");
            return myConnection;
        } else {
            // 返回原始的connection
            return (Connection) joinPoint.proceed();
        }
    }


}
